library(rgdal)
library(rgeos)
library(tmap)
library(leaflet)
library(sp)
library(data.table)
library(tidyverse)
서울시 공공 자전거 대여소 정보는 https://data.seoul.go.kr/dataList/OA-13252/F/1/datasetView.do 에서 다운로드가 가능하다. 참고 : stn 데이터는 링크에 있는 데이터와 다른 데이터지만 정비소 좌표만 이용하기 때문에 코드의 내용은 같다.
stn <- fread('C:\\Users\\uos\\Desktop\\Master\\bike sharing\\stn_info.csv', encoding = 'UTF-8')
stn <- stn %>% filter(!STATION_LONGITUDE == 0) # 좌표가 0인 정거장 제외
stn <- stn %>% filter(!STATION_GRP_NAME == '정비센터') # 정비센터 9개 정거장 제외
stn <- stn[, c(1, 12, 8, 9)]
stn
## STATION_ID 거치대개수 STATION_LATITUDE STATION_LONGITUDE
## 1: ST-10 10 37.55275 126.9186
## 2: ST-100 15 37.53667 127.0736
## 3: ST-1000 10 37.51038 126.8668
## 4: ST-1002 10 37.52990 126.8765
## 5: ST-1003 10 37.53955 126.8283
## ---
## 1652: ST-993 10 37.52143 126.8574
## 1653: ST-994 15 37.52916 126.8727
## 1654: ST-995 15 37.51068 126.8574
## 1655: ST-996 15 37.52433 126.8505
## 1656: ST-997 15 37.53439 126.8696
대한민구 행정구역 관련된 데이터는 http://www.gisdeveloper.co.kr/?p=2332 에서 다운로드가 가능하다.
areas <- readOGR('C:\\Users\\uos\\Desktop\\Master\\Spatial Data Analysis\\서울시군구\\TL_SCCO_SIG_W.shp', encoding = 'utf-8')
## OGR data source with driver: ESRI Shapefile
## Source: "C:\Users\uos\Desktop\MASTER\Spatial Data Analysis\서울시군구\TL_SCCO_SIG_W.shp", layer: "TL_SCCO_SIG_W"
## with 25 features
## It has 6 fields
## Integer64 fields read as strings: ESRI_PK
coordinates(areas)
## [,1] [,2]
## 0 127.0324 37.66907
## 1 126.9270 37.61922
## 2 127.0549 37.58196
## 3 126.9517 37.49888
## 4 126.9008 37.46058
## 5 126.8563 37.49441
## 6 126.9773 37.59492
## 7 127.0112 37.64346
## 8 127.0929 37.59781
## 9 127.0630 37.49665
## 10 126.8228 37.56124
## 11 126.9960 37.56015
## 12 127.1470 37.55047
## 13 127.0858 37.54671
## 14 126.9081 37.55942
## 15 126.9454 37.46738
## 16 127.0312 37.47330
## 17 127.0176 37.60570
## 18 127.0751 37.65257
## 19 127.1154 37.50564
## 20 127.0411 37.55103
## 21 126.9391 37.57770
## 22 126.8555 37.52480
## 23 126.9103 37.52240
## 24 126.9799 37.53139
plot(areas)
R에서 shp 파일을 불러오기 위해서는 rgdal 패키지에 있는 readOGR 함수를 이용해야한다. shp 파일은 polygon 형태로 저장되어 있는 데이터인데 데이터 프레임 형태처럼 직관적이지 않기 때문에 다루기가 까다롭다. R에서는 shp 파일을 다루기 위해서 대표적으로 sp, sf 패키지가 있다. sf 패키지는 tidyvese와 연동이 잘되고 shp 파일을 데이터 프레임 형태로 직관적으로 볼 수 있다는 장점이 있다. 좌표변환이 sp 패키지보다 까다롭다. sp 패키지는 좌표 변환이 상대적으로 쉽고, tmap 패키지를 이용하면 ggplot만큼 쉽게 시각화가 가능하다.
coordinates 함수를 이용해서 좌표를 볼 수 있다.
좌표계 관련된 자세한 설명은 이 블로그의 글을 참고하면 된다.
https://statkclee.github.io/spatial/geo-spatial-r.html
어떤 위치를 정의할 때 지도 api별로 다른 좌표계를 사용한다. 따라서 자료를 병합할 때에는 좌표계를 똑같이 맞춰야한다. 서울시 행정지도의 좌표계를 보면 CRS arguments: +proj=longlat +datum=WGS84 +no_defs 이므로 따릉이 데이터의 좌표계를 EPSG:4326로 설정해주었다.
지도 시각화를 위해서는 sp패키지를 이용해서 csv 파일을 SpatialPointsDataFrame으로 바꿔주여야한다. SpatialPointsDataFrame(data[경도, 위도], data, 좌표계)이다. areas@bbox %>% head() : 최소, 최대 위경도를 알 수 있다. stn.points@coords %>% head() : 좌표값이 서울시 행정지도의 좌표값이 유사하게 바뀌었음을 알 수 있다.
stn.points <- SpatialPointsDataFrame(stn[,c(4,3)], stn, proj4string = CRS("+init=EPSG:4326"))
areas@proj4string
## CRS arguments: +proj=longlat +datum=WGS84 +no_defs
areas@bbox %>% head()
## min max
## x 126.76451 127.1838
## y 37.42831 37.7013
stn.points@coords %>% head()
## STATION_LONGITUDE STATION_LATITUDE
## [1,] 126.9186 37.55275
## [2,] 127.0736 37.53667
## [3,] 126.8668 37.51038
## [4,] 126.8765 37.52990
## [5,] 126.8283 37.53955
## [6,] 126.8310 37.51410
시각화는 shp 파일의 좌표계 변환만 잘해주면 tmap 패키지를 이용해서 간단하게 구현이 가능하다.
변수의 범주를 어떻게 나눌지를 정하는 것이 시각화할 때 중요하다. 옵션은 다음과 같다.
style = ‘equal’ : 변수의 range를 n으로 나눔
style = ‘pretty’ : 변수의 range를 균등한 값으로 나눔
style = ‘quantile’ : 각 그룹에 동일한 case 개수 할당
style = ‘jenks’ : 데이터에서 nature breaks 를 찾음
style = ‘Cat’ : 변수가 범주형 변수일 경우
scale : 점 크기 지정
n = 5(default) : interval 수 지정
tm_compass() : 방위각 표시
frame : 지도 외각에 박스 그릴지 여부
tm_shape(areas) + tm_borders(alpha = 0.5)+
tm_shape(stn.points)+tm_dots(col = '거치대개수', palette = "Reds", style = "quantile", scale = 2.5) +
tm_compass()+
tm_layout(legend.text.size = 0.8, legend.title.size = 1.1, frame = FALSE)
## Compass not supported in view mode.
## Warning in sp::proj4string(obj): CRS object has comment, which is lost in output
tmap 패키지는 leaflet 패키지를 이용해서 간단하게 interactive한 map을 만들 수 있다.
library(leaflet)
tmap_mode("view")
## tmap mode set to interactive viewing
tm_shape(areas) + tm_borders(alpha = 0.5)+
tm_shape(stn.points)+tm_dots(col = '거치대개수', palette = "Reds", style = "quantile", scale = 2.5) +
tm_compass()+
tm_layout(legend.text.size = 0.8, legend.title.size = 1.1, frame = FALSE)
## Compass not supported in view mode.
## Warning in sp::proj4string(obj): CRS object has comment, which is lost in output